package lv.clientedisqueria.view.login;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import lv.clientedisqueria.controller.login.LoginController;
import lv.clientedisqueria.model.login.LoginModel;
import lv.clientedisqueria.view.Mensajeria;
import lv.clientedisqueria.view.principal.PrincipalView;

/**
 * Clase vista del login, permite que un usuario se pueda logear 
 */
@SuppressWarnings("serial")
public class LoginView extends JDialog implements Observer {

	private JLabel usuarioLbl;
	private JTextField usuario;
	private JLabel passwordLbl;
	private JPasswordField password;
	private JButton aceptarBtn;
	private JButton cancelarBtn;
	
	private PrincipalView principalView;
	
	private final LoginController loginController;

	public LoginView() {
		this.loginController = new LoginController(new LoginModel());
		this.loginController.addObserver(this);
		iniciarVista();
	}
	
	private void iniciarVista() {
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setTitle("Login de Disqueria");
		this.setSize(500, 100);
		this.setLocation(400, 350);
		this.setResizable(false);
		this.setLayout(new GridLayout(3,3));
		this.add(getUsuarioLbl());
		this.add(getUsuario());
		this.add(getPasswordLbl());
		this.add(getPassword());
		this.add(getAceptarBtn());
		this.add(getCancelarBtn());
	}

	public void mostrar(){
		this.setVisible(true);
	}

	private JLabel getUsuarioLbl() {
		if (usuarioLbl == null){
			usuarioLbl = new JLabel("Usuario");
		}
		return usuarioLbl;
	}

	private JTextField getUsuario() {
		if (usuario == null){
			usuario = new JTextField();
		}
		return usuario;
	}

	private JLabel getPasswordLbl() {
		if (passwordLbl == null){
			passwordLbl = new JLabel("Password");
		}
		return passwordLbl;
	}

	//TODO(maxi) ver como hacer para que quede el text como password
	private JTextField getPassword() {
		if(password == null){
			password = new JPasswordField();
		}
		return password;
	}

	@Override
	public void update(Observable o, Object arg) {

	}

	private JButton getAceptarBtn() {
		if(aceptarBtn == null){
			aceptarBtn = new JButton("Aceptar");
			aceptarBtn.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent e) {
					try {
						loginController.loguearUsuario(usuario.getText(), password.getSelectedText());
						principalView = new PrincipalView();
						principalView.mostrar();
						LoginView.this.dispose();
					} catch (RuntimeException ex) {
						Mensajeria.mensajeError(LoginView.this, ex.getMessage());
					}
				}
			});
		}
		return aceptarBtn;
	}

	private JButton getCancelarBtn() {
		if(cancelarBtn == null){
			cancelarBtn = new JButton("Cancelar");
			cancelarBtn.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent e) {
					usuario.setText("");
					password.setText("");
				}
			});
		}
		return cancelarBtn;
	}
}